<?php
class GruposModel extends CustomModel
{

    public function getGrupos($pageNumber)
    {
        $gruposAbm = new ABM('grupos');
        $grupos = $gruposAbm->getPaginated($pageNumber, array('status' => STATUS_ONLINE), 10, 'nombre ASC', true);
        if (!empty($grupos['results']))
        {
            $ids = array_keys($grupos['results']);
            $filter = new dbFilter('fkgrupo', 'IN', $ids);
            $join = array(
                'vehiculos' => array(
                    'vehiculos_por_grupo.fkvehiculo' => 'vehiculos.idvehiculo',
                    'vehiculos.status'               => STATUS_ONLINE,
                )
            );
            $vehiculosPorGrupoAbm = new ABM('vehiculos_por_grupo');
            $vehiculosPorGrupo = $vehiculosPorGrupoAbm->getWithJoin($filter, $join, false, false, false);
            if (!empty($vehiculosPorGrupo))
            {
                foreach ($vehiculosPorGrupo as $vehiculo)
                {
                    $idGrupo = $vehiculo['fkgrupo'];
                    if (!empty($grupos['results'][$vehiculo['fkgrupo']]))
                    {
                        if (empty($grupos['results'][$vehiculo['fkgrupo']]['vehiculos']))
                        {
                            $grupos['results'][$vehiculo['fkgrupo']]['vehiculos'] = array();
                        }
                        $grupos['results'][$vehiculo['fkgrupo']]['vehiculos'][$vehiculo['fkvehiculo']] = $vehiculo;
                    }
                }
            }
        }
        return $grupos;
    }

    public function getVehiculos()
    {
        $vehiculosAbm = new ABM('vehiculos');
        return $vehiculosAbm->get(array('status' => STATUS_ONLINE), 'nombre ASC');
    }

    public function nuevoGrupo($grupo, $vehiculos)
    {
        $this->db->beginTransaction();
        $gruposAbm = new ABM('grupos');
        unset($grupo['vehiculos']);
        if ($idGrupo = $gruposAbm->insert($grupo))
        {
            $vehiculosPorGrupoAbm = new ABM('vehiculos_por_grupo');
            foreach ($vehiculos as $vehiculo)
            {
                $relacion = array('fkgrupo' => $idGrupo, 'fkvehiculo' => $vehiculo);
                if ($vehiculosPorGrupoAbm->insert($relacion, false))
                {
                    // void just in case
                }
                else
                {
                    $this->db->rollbackTransaction();
                    return false;
                }
            }
            $this->db->commitTransaction();
            return true;
        }
        else
        {
            $this->db->rollbackTransaction();
            return false;
        }
    }

    public function editarGrupo($idGrupo, $grupo, $vehiculos)
    {
        $this->db->beginTransaction();
        $gruposAbm = new ABM('grupos');
        unset($grupo['vehiculos']);
        if ($gruposAbm->update(array('idgrupo' => $idGrupo), $grupo))
        {
            $delGruposVehiculos = "DELETE FROM vehiculos_por_grupo WHERE fkgrupo = $idGrupo;";
            if (!$this->db->rawQuery($delGruposVehiculos))
            {
                $this->db->rollbackTransaction();
                return false;
            }
            else
            {
                $vehiculosPorGrupoAbm = new ABM('vehiculos_por_grupo');
                foreach ($vehiculos as $vehiculo)
                {
                    $relacion = array('fkgrupo' => $idGrupo, 'fkvehiculo' => $vehiculo);
                    if ($vehiculosPorGrupoAbm->insert($relacion, false))
                    {
                        // void just in case
                    }
                    else
                    {
                        $this->db->rollbackTransaction();
                        return false;
                    }
                }
                $this->db->commitTransaction();
                return true;
            }
        }
        else
        {
            $this->db->rollbackTransaction();
            return false;
        }
    }

    public function grupoExists($id)
    {
        $gruposAbm = new ABM('grupos');
        $grupo = $gruposAbm->get(array('idgrupo' => $id, 'status' => STATUS_ONLINE));
        if ($grupo)
        {
            $filter = new dbFilter('fkgrupo', '=', $id);
            $join = array(
                'vehiculos' => array(
                    'vehiculos_por_grupo.fkvehiculo' => 'vehiculos.idvehiculo',
                    'vehiculos.status'               => STATUS_ONLINE,
                )
            );
            $vehiculosPorGrupoAbm = new ABM('vehiculos_por_grupo');
            $vehiculosPorGrupo = $vehiculosPorGrupoAbm->getWithJoin($filter, $join);
            $grupo[$id]['vehiculos'] = $vehiculosPorGrupo;
            return $grupo[$id];
        }
        else
        {
            return false;
        }
    }

    public function borrarGrupo($id)
    {
        $gruposAbm = new ABM('grupos');
        return $gruposAbm->update(array('idgrupo' => $id), array('status' => STATUS_OFFLINE));
    }

}
?>